/* Soubor je ulozen v kodovani UTF-8.
 * Kontrola kódování: Příliš žluťoučký kůň úpěl ďábelské ódy.
 */
package cz.pecinovsky.česky.oopnz.utility;



////////////////////////////////////////////////////////////////////////////////
//%%+  +++++ Konec ignorovaného počátečního textu - prostor pro importy +++++

//%X+ xxxxx Začátek přeskakovaného textu s deklarací obalové třídy xxxxx
/*******************************************************************************
 *<pre>
 * Předchozí:   Není - toto_je_nově_definovaná_třída
 *              Ttt v projektu Ppp
 * Následující: Prozatím není
 *
 * Projekt  Ppp
 *   + Přidáno
 *   - Odebráno
 *   ~ Změněno
 *</pre>
 *
 * @author Rudolf PECINOVSKÝ
 * @version 6.03.2017 — 2010-11-08
 */
////////////////////////////////////////////////////////////////////////////////
//%%+  +++++ Konec ignorovaného počátečního textu +++++


/*******************************************************************************
 * Instance třídy {@code Oblast} představují přepravky uchovávající informace
 * o pozici a rozměru objektu.
 * Proto jsou jejich atributy deklarovány jako veřejné konstanty.
 *
 * @author Rudolf PECINOVSKÝ
 * @version 6.03.2017 — 2010-11-08
 */
public class Oblast
{
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//%X+ <999

    /** Indikátor toho, že hash-code byl již spočítán. */
    private static final int INIT_HASH_CODE = Integer.MIN_VALUE;



//%X-
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================

    /** Vodorovná souřadnice dané oblasti, tj. jejího levého horního rohu. */
    public final int x;

    /** Svislá souřadnice dané oblasti, tj. jejího levého horního rohu. */
    public final int y;

    /** Šířka oblasti. */
    public final int šířka;

    /** Výška oblasti. */
    public final int výška;



//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//%X+ <999

    /** Jednou spočtený hascode se pak již pouze předává, ale už nepočítá. */
    private int hashCode = INIT_HASH_CODE;



//%X-
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================

    /***************************************************************************
     * Vytvoří oblast se zadaným umístěním a rozměry.
     *
     * @param x     Vodorovná souřadnice oblasti, tj. jejího levého horního rohu
     * @param y     Svislá souřadnice oblasti, tj. jejího levého horního rohu
     * @param šířka Šířka oblasti
     * @param výška Výška oblasti
     */
    public Oblast( int x, int y, int šířka, int výška )
    {
        this.x     = x;
        this.y     = y;
        this.šířka = šířka;
        this.výška = výška;
    }


    /***************************************************************************
     * Vytvoří oblast se zadaným umístěním a rozměry.
     *
     * @param pozice  Pozice oblasti, tj. pozice jejího levého horního rohu
     * @param rozměr  Rozměr vytvářené oblasti
     */
    public Oblast( Pozice pozice, Rozměr rozměr )
    {
        this( pozice.x, pozice.y, rozměr.šířka, rozměr.výška );
    }



//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================

    /***************************************************************************
     * Vrátí hodnotu vodorovné souřadnice oblasti.
     *
     * @return  Vodorovná souřadnice
     */
    public int getX()
    {
        return x;
    }


    /***************************************************************************
     * Vrátí hodnotu svislé souřadnice oblasti.
     *
     * @return  Svislá souřadnice
     */
    public int getY()
    {
        return y;
    }


    /***************************************************************************
     * Vrátí pozici oblasti.
     *
     * @return  Pozice oblasti
     */
    public Pozice getPozice()
    {
        return new Pozice ( x, y );
    }


    /***************************************************************************
     * Vrátí velikost šířky oblasti.
     *
     * @return  Šířka oblasti
     */
    public int getŠířka()
    {
        return šířka;
    }


    /***************************************************************************
     * Vrátí velikost výšky oblasti.
     *
     * @return  Výška oblasti
     */
    public int getVýška()
    {
        return výška;
    }


    /***************************************************************************
     * Vrátí rozměr oblasti.
     *
     * @return  Rozměr oblasti
     */
    public Rozměr getRozměr()
    {
        return new Rozměr (šířka, výška);
    }



//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================
//%A+ >127

    /***************************************************************************
     * Vrátí informaci o tom, představuje-li instance zadaná v parametru
     * stejnou oblast.
     *
     * @param  o   Testovaná instance
     * @return Je-li zadaná instance oblastí se stejnými hodnotami atributů,
     *         vrátí {@code true}, jinak vrátí {@code false}.
     */
    @Override
    public boolean equals( Object o )
    {
//%A-
//%I+ >127 -135
//        return (o instanceof Oblast)              &&
//               (((Oblast)o).x     == this.x)      &&
//               (((Oblast)o).y     == this.y)      &&
//               (((Oblast)o).šířka == this.šířka)  &&
//               (((Oblast)o).výška == this.výška);
//%I-
//%A+ >135
        if( ! (o instanceof Oblast) ) {
            return false;               //==========>
        }
        Oblast druhá = (Oblast)o;
        return (druhá.x     == x)     && (druhá.y     == y)    &&
               (druhá.šířka == šířka) && (druhá.výška == výška);
//%A-
//%A+ >127
    }

//%A-
//%X+ <999

    /***************************************************************************
     * Vrátí heš-kód dané instance.
     *
     * @return  Heš-kód
     */
    @Override
    public int hashCode()
    {
        if( hashCode == INIT_HASH_CODE ) {
            hashCode = (((17 + x) * 67 + y) * 67 + šířka) * 67 + výška;
        }
        return hashCode;
    }

//%X-
//%X+ <126

    /***************************************************************************
     * Vrací textovou reprezentaci (podpis) dané instance.
     * Používá se především k ladicím účelům.
     *
     * @return Požadovaná textová reprezentace.
     */
    @Override
    public String toString()
    {
        return "Oblast:[x=" + x + ", y=" + y +
               ", šířka=" + šířka + ", výška=" + výška + "]";
    }

//%X-
//%X+ <126


//%X-
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTY A METODA MAIN =======================================================
}
